package web.beans;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.NotEmpty;

import web.utility.Utility;
import ejb.dto.EscursioneDTO;
import ejb.dto.HotelDTO;
import ejb.dto.PacchettoDTO;
import ejb.dto.ProdottoBaseDTO;
import ejb.dto.VoloDTO;
import ejb.managerbeans.EscursioneManagerBeanLocal;
import ejb.managerbeans.HotelManagerBeanLocal;
import ejb.managerbeans.PackManagerBeanLocal;
import ejb.managerbeans.ProdottoManagerBeanLocal;
import ejb.managerbeans.VoloManagerBeanLocal;

@ManagedBean( name = "modificaPacchetto" )
@SessionScoped
public class ModificaPacchetto 
{
	@EJB
	PackManagerBeanLocal pmb;
	@EJB
	ProdottoManagerBeanLocal pbmb;
	@EJB
	EscursioneManagerBeanLocal emb;
	@EJB
	HotelManagerBeanLocal hmb;
	@EJB
	VoloManagerBeanLocal vmb;
	
	@ManagedProperty( value = "#{sessionProductBean.id_prodotto}" )
	private int id_prodotto;
	
	@NotEmpty
	private String cittaArrivo;

	private float prezzoTotale;
	private float prezzoEscursione;
	private float prezzoVolo;
	private float prezzoHotel;
	private List<Integer> listSconti;
	private Date today;

	private PacchettoDTO p;
	
	ProdottoBaseDTO pbDTO;
	String errore;
	
	private List<VoloDTO> listVoli;
	private List<HotelDTO> listHotel;
	private List<EscursioneDTO> listEscursione;
	
	@NotNull
	private VoloDTO voloSelected;
	@NotNull
	private HotelDTO hotelSelected;
	@NotNull
	private EscursioneDTO escursioneSelected;
	
	@PostConstruct
	public void init()
	{
		p = pmb.getPackDTOPerId( id_prodotto );
		prezzoTotale = prezzoEscursione = prezzoHotel = prezzoVolo = 0;
		today = new Date();
		listVoli = new ArrayList<VoloDTO>();
		listHotel = new ArrayList<HotelDTO>();
		listEscursione = new ArrayList<EscursioneDTO>();
		errore = new String();
		escursioneSelected = new EscursioneDTO();
		voloSelected = new VoloDTO();
		hotelSelected = new HotelDTO();
		listSconti = Utility.sconti();
	}
	
	public void cerca()
	{
		listHotel = hmb.getHotelDTODatesCity(p.getDataInizio(), p.getDataFine(), cittaArrivo);
		listVoli = vmb.getVoloDTODatesArrivalCity(p.getDataInizio(), p.getDataFine(), cittaArrivo);
		listEscursione = emb.getEscursioneDTOInDateCity(p.getDataInizio(), p.getDataFine(), cittaArrivo);
	}
	
	public String modificaPacchetto()
	{
		if( escursioneSelected == null || voloSelected == null || hotelSelected == null )
		{
			errore = "Selezionare un prodotto per tipo";
			return null;
		}
		p.setPrezzo( escursioneSelected.getPrezzo() + voloSelected.getPrezzo() + hotelSelected.getPrezzo() );
		p.getProdottiBase().add( escursioneSelected.convertToPbDTO() );
		p.getProdottiBase().add( voloSelected.convertToPbDTO() );
		p.getProdottiBase().add( hotelSelected.convertToPbDTO() );	
		pmb.modificaPacchetto(p);
		
		return "index?faces-redirect=true";
	}

	public String annullaCreazione()
	{
		return "index?faces-redirect=true";
	}

	public String getErrore() {
		return errore;
	}

	public void setErrore(String errore) {
		this.errore = errore;
	}
	
	public PacchettoDTO getP() {
		return p;
	}

	public void setP(PacchettoDTO p) {
		this.p = p;
	}

	public String getCittaArrivo() {
		return cittaArrivo;
	}

	public void setCittaArrivo(String cittaArrivo) {
		this.cittaArrivo = cittaArrivo;
	}

	public Date getToday() {
		return today;
	}

	public void setToday(Date today) {
		this.today = today;
	}

	public List<VoloDTO> getListVoli() {
		return listVoli;
	}

	public void setListVoli(List<VoloDTO> listVoli) {
		this.listVoli = listVoli;
	}

	public List<HotelDTO> getListHotel() {
		return listHotel;
	}

	public void setListHotel(List<HotelDTO> listHotel) {
		this.listHotel = listHotel;
	}

	public List<EscursioneDTO> getListEscursione() {
		return listEscursione;
	}

	public void setListEscursione(List<EscursioneDTO> listEscursione) {
		this.listEscursione = listEscursione;
	}

	public VoloDTO getVoloSelected() {
		return voloSelected;
	}

	public void setVoloSelected(VoloDTO voloSelected) {
		this.voloSelected = voloSelected;
	}

	public HotelDTO getHotelSelected() {
		return hotelSelected;
	}

	public void setHotelSelected(HotelDTO hotelSelected) {
		this.hotelSelected = hotelSelected;
	}

	public EscursioneDTO getEscursioneSelected() {
		return escursioneSelected;
	}

	public void setEscursioneSelected(EscursioneDTO escursioneSelected) {
		this.escursioneSelected = escursioneSelected;
	}

	public float getPrezzoTotale() {
		return prezzoTotale;
	}

	public void setPrezzoTotale(float prezzoTotale) {
		this.prezzoTotale = prezzoTotale;
	}

	public float getPrezzoEscursione() {
		return prezzoEscursione;
	}

	public void setPrezzoEscursione(float prezzoEscursione) {
		this.prezzoEscursione = prezzoEscursione;
	}

	public float getPrezzoVolo() {
		return prezzoVolo;
	}

	public void setPrezzoVolo(float prezzoVolo) {
		this.prezzoVolo = prezzoVolo;
	}

	public float getPrezzoHotel() {
		return prezzoHotel;
	}

	public void setPrezzoHotel(float prezzoHotel) {
		this.prezzoHotel = prezzoHotel;
	}

	public List<Integer> getListSconti() {
		return listSconti;
	}

	public void setListSconti(List<Integer> listSconti) {
		this.listSconti = listSconti;
	}
	
	public int getId_prodotto() {
		return id_prodotto;
	}

	public void setId_prodotto(int id_prodotto) {
		this.id_prodotto = id_prodotto;
	}
}
